<?php
/**
 * Game_Coordinates
 *
 * Класс Game_Coordinates отвечает за обработку коорднат
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
class Game_Coordinates {
  
	protected static $_coordinatesAmount = 2;
	protected $_arrCoordinates = array(); // Массив с информацией о ресурсах
	
	
	public function __construct($arrCoordinates = array()) {
		if (is_subclass_of($arrCoordinates, 'ActiveRecord')) $arrCoordinates = $arrCoordinates->tableFields;
		if (is_array($arrCoordinates)) {
    	for ($i = 1; $i <= self::$_coordinatesAmount; $i++) {
    		$this->_arrCoordinates[$i] = (
    		 	isset($arrCoordinates['coord_' . $i]) 
    		 	? $arrCoordinates['coord_' . $i] 
    		 	: $arrCoordinates[$i]
    		);
    	}
		}
		elseif (func_num_args() == self::$_coordinatesAmount) {
	    for ($i = 1; $i <= self::$_coordinatesAmount; $i++) {
		    $this->_arrCoordinates[$i] = func_get_arg($i - 1);
	    }
		}
  }
  
	/**
	 * Классический геттер
	 * 
	 */
	public function getCoordinatesData() {
		return $this->_arrCoordinates;
	}
	
	/**
	 * Проверяет, существует ли такое место
	 */
	public function getPlaceId() {
		$stmt = "
			SELECT `place`.`ID_place`
			FROM `place`
			WHERE " . $this->_getCoordsCondition()  . " 
		";
		$objDB = Service_Database::instance();
		return $objDB->selectSimpleField($stmt);
	}
	
	/**
	 * Получает идентификатор пользователя по координатам места
	 */
	public function getUserId() {
	  $stmt = "
			SELECT `place`.`ID_user`
			FROM `place`
			WHERE " . $this->_getCoordsCondition()  . "
		";

    $objDB = Service_Database::instance();
    return $objDB->selectSimpleField($stmt);
	}
	
	/**
	 * Получает условие для выборки из базы данных по координатам
	 * 
	 * @param string $tableName - название таблицы, в которой ищутся координаты
	 */
	private function _getCoordsCondition($tableName = 'place') {
	  $stmt = "";
    for ($i = 1; $i <= self::$_coordinatesAmount; $i++) {
        $stmt .= ($i > 1 ? " AND " : null) . " `place`.`coord_" . $i . "` = '" . $this->_arrCoordinates[$i] . "' ";
    }
    return $stmt;
	}

	/**
	 * Определяет время, требуемое для преодоления пути из текущего места при заданной скорости
	 * 
	 * @param int $speed
	 * @param Game_Coordinates $objCurrentPlaceCoordinates - координаты, откуда ведем путь. По умолчанию из места отправки
	 * 
	 * @return int - время в секундах
	 */
	public function getMoveTime($speed, Game_Coordinates $objCurrentPlaceCoordinates = null) {
		$objGeneral = Game_General::instance();
		if (empty($objCurrentPlaceCoordinates)) $objCurrentPlaceCoordinates = new Game_Coordinates($objGeneral->objPlace);
		return  round($this->getDistance($objCurrentPlaceCoordinates) / $speed * 60 * 60);
	}

	/**
	 * Определяет расстояние между точками
	 * 
	 * @param Game_Coordinates $objCoordinateToCalculate
	 * 
	 * @return float - расстояние в "клетках" 
	 */
	public function getDistance(Game_Coordinates $objCoordinateToCalculate) {
		$arrSecondCoordinates = $objCoordinateToCalculate->getCoordinatesData();
		$sum = 0;
		for ($i = 1; $i <= self::$_coordinatesAmount; $i++) {
			$currentDelta = $this->_arrCoordinates[$i] - $arrSecondCoordinates[$i];
			$sum += $currentDelta * $currentDelta; 
		}
		return sqrt($sum);
	}

	/**
	 * Получает объект места по его координатам
	 *
	 */
	public function getPlace() {
	    return new Game_Place($this->getPlaceId());
	}
	

	/**
	 * Получает объект пользователя по координатам места
	 *
	 */
	public function getUser() {
	    return new Game_User($this->getUserId());
	}
  
}
?>